//
//  SinaAccoountViewModel.swift
//  weibo
//
//  Created by guyue on 16/1/3.
//  Copyright © 2016年 guyue. All rights reserved.
//

import UIKit
import AFNetworking

class SinaAccoountViewModel: NSObject {
    
    //Swift 单例
    
    //static 静态的
    static var shareInstance: SinaAccoountViewModel = SinaAccoountViewModel()
    
    
    
    
    
     func getToken(code:String,success: ()->(),failure: (error: NSError)->()){
        
        //创建一个网络请求实例
        let afn = AFHTTPSessionManager()
        
        //增加解析类型  使用插入方法
        afn.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        //拼接参数
        /*
        
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        
        */
        
        let params = [ "client_id":app_Key,
            "client_secret":app_Secret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":redirect_url
            
            
            
            
            
        ]
        
        
        //发送数据请求
        //此url是从接口文档中来的(获取授权过的Token)
        afn.POST("https://api.weibo.com/oauth2/access_token", parameters: params, success: { (_, JSON) -> Void in
            
            printLog(JSON)
            
            //打印的JSON文件
            /*
            "access_token" = "2.00ayTo2GbK6caDa0aca78c52YbmkfE";
            "expires_in" = 144464;
            "remind_in" = 144464;
            uid = 5819131680;
            */
            
            //JSON需要强制转换类型
            let dict = JSON as? [String: AnyObject]
            
            if let dic = dict {
                
                let account = SinaAccountModel(dic: dic)
                
                
                //获取到Token之后,获取用户个人信息 (因在一个闭包里面,所以需要加上self)
                //self.getPersonInfo(account)
                self.getPersonInfo(account, success: success, failure: failure)
            }
            
            
            // printLog(account.expires_date)
            
            //printLog(account)
            
            
            }) { (_, error) -> Void in
                
                printLog(error)
                
                //这里调用的话,会回调到第一步中
                failure(error: error)
        }
        
    }
    
    
    //MARK:--网络请求,获取Token
    //MARK:--通过Token来获取用户信息
     func getPersonInfo(accessModel: SinaAccountModel,success: ()->(),failure: (error: NSError)->()){
        
        //创建afn实例
        let afn = AFHTTPSessionManager()
        
        
        
        
        //拼接参数
        /*
        必选	           类型及范围 	说明
        source	false	string	采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
        access_token	false	string	采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
        uid	false	    int64	需要查询的用户ID。
        screen_name   	false	string	需要查询的用户昵称。
        
        注意
        
        参数uid与screen_name二者必选其一，且只能选其一
        */
        
        let params = [
            "access_token":accessModel.access_token!,
            "uid":accessModel.uid!
        ]
        
        //[String : String?] 这个类型对于 AnyObject?来说是不能够转换的.需要把其转换为[String : String].所以加上强制解包即可
        
        
        
        
        
        //发送请求,get方式
        afn.GET("https://api.weibo.com/2/users/show.json", parameters: params, success: { (_, JSON) -> Void in
            
            printLog(JSON)
            
            if let dic = JSON as? [String: AnyObject]{
                
                accessModel.screen_name = dic["screen_name"] as? String
                accessModel.profile_image_url = dic["profile_image_url"] as? String
                
                
                /*
                dic 是一个 [String : AnyObject]类型的字典,
                通过key获取到 的值是 AnyObject
                accessModel.screen_name 他是 String类型
                不同类型直接不可以赋值,所以需要我们 把 AnyObject 转换成 String
                
                as! 和 as? 取决于 我前边值
                */
                
                
                
                //第四步
                //保存用户信息
                accessModel.saveInfo()
                
                //回调,告诉第一个方法,一二三步都成功了
                success()
                
            }
            
            printLog(accessModel.screen_name)
            printLog(accessModel.profile_image_url)
            
            }) { (_, error) -> Void in
                printLog(error)
                
                //这里会回调到第二步
                failure(error: error)
        }
        
    }
    
    
    
    



}




